package com.example.xjt;

import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableCaching
@Slf4j
@EnableTransactionManagement // 启注解事务管理，等同于xml配置方式的 <tx:annotation-driven />
//启用JPA自动写新增时间/修改时间 （插入的时间可以是Date也可以是Long型）
@EnableJpaAuditing
@SpringBootApplication
public class XjtApplication {

    public XjtApplication() {
        log.debug("---> debug start! <------");
        log.info("---> info start! <------");
        log.warn("---> warn start! <------");
        log.error("---> error start! <------");

        System.out.println("===> System.out.println <=====");
    }




    public static void main(String[] args) {
        SpringApplication.run(XjtApplication.class, args);
    }

    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager){
        System.out.println(">>>>>>>>>>自动注入的事务管理器" + platformTransactionManager.getClass().getName());
        return new Object();
    }

    //关于事务管理器，不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖，框架会默认注入 DataSourceTransactionManager 实例。
    // 如果你添加的是 spring-boot-starter-data-jpa 依赖，框架会默认注入 JpaTransactionManager 实例

    //1. 事务方法的嵌套调用会产生事务传播。
    //2. spring 的事务管理是线程安全的
    //3. 父类的声明的 @Transactional 会对子类的所有方法进行事务增强；
    //   子类覆盖重写父类方式可覆盖其 @Transactional 中的声明配置。
    //
    //4. 类名上方使用 @Transactional，类中方法可通过属性配置来覆盖类上的 @Transactional 配置；
    //   比如：类上配置全局是可读写，可在某个方法上改为只读。
    //https://blog.csdn.net/jiangyu1013/article/details/84397366
}
